from flask import Blueprint,request,jsonify
#密码加密
from werkzeug.security import generate_password_hash,check_password_hash
from conf.comm import sqlalchemy_context,send_message
from database import *
import json
import re
import random
from utils.redisconn import r
#蓝图初始化
bp_users = Blueprint('users',__name__)
#注册功能实现
@bp_users.route('/reg',methods=['POST'])
@sqlalchemy_context()
def reg():
    #获取用户输入
    data = request.data
    if not data:
        data = request.form
    else:
        data = json.loads(data)
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #构造user
    try:
         user = User(username=data['username'],password=generate_password_hash(data['password']),mobile=data['mobile'])
         db.session.add(user)
         db.session.commit()
         return jsonify({"code":200})
    except:
        return jsonify({"code":10010}) 

#发送验证码
@bp_users.route('/sendsms',methods=['POST'])
def sendsms():
    #传递手机号
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #验证是否30秒内已经发过验证码
    code  = r.get_str(mobile)
    if code:
        return jsonify({"code":10015,'mes':'30少内您已经发过验证码'})
    #生成验证码
    code = str(random.randint(100000,999999))
    #调用短信接口
    flag = send_message(mobile,code,1)
    if flag:
        #发送成功，存入redis
        r.set_str(mobile,code,60)
        #返回结果（验证码）
        return jsonify({'code':200,'smscode':code})
    else:
        return jsonify({'code':20011,'mes':'发送失败，请重试'})

from utils.myjwt import myjwt
@bp_users.route('/login',methods=['POST'])
def login():
    #获取用户输入
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #用户输入的验证码
    code = data['code']
    # 通过手机号redis查
    rcode = r.get_str(mobile)
    # 存在值对比-》
    if rcode:
        if int(code) == int(rcode):
            # 用手机号生成一个新用户
            user = User.query.filter_by(mobile=mobile).first()
            #用户不存在添加
            if not user:
                user = User(username=mobile,mobile=mobile)
                db.session.add(user)
                db.session.commit()
                #清除redis
            r.del_str(mobile)
            # 返回结果（pyjwt生成token）
            token = myjwt.jwt_encode({'data':{'username':user.username,'userid':user.id}})
            return jsonify({"code":200,'userid':user.id,'username':user.username,'token':token})
        else:
            #不存在返回
            return jsonify({"code":20013,'mes':'验证码错误，请重新输入'})
    else:
     #不存在返回
        return jsonify({"code":20012,'mes':'验证码不存在，请重新发送'})


#返回用户信息接口
@bp_users.route('/getuserinfo')
def getuserinfo(): 
        #数据库查询返回
        id = request.args.get('userid')
        User.query.filter_by(id=id).first()
        dict['id'] = user.username
        dict['username'] = user.username
        dict['mobile'] = user.mobile
        dict['avater'] = user.avater
        return jsonify({"code":200,'user':dict})

# 在执行接口前调用
@bp_users.before_request
def before_request():
    # print(request.path)
    #定义一个白名单，把不需要token认证的接口放到列表里
    list=['/users/login','/users/reg','/users/sendsms']
    if request.path not in list:
        #获取token
        try:
            token = request.headers['Token']
        except:
            return jsonify({"code":403,'mes':'请传递token'})
        #解密重新对比token
        newtoken = myjwt.jwt_decode(token)
        if newtoken and myjwt.check(token,newtoken):
            pass
        else:
            return jsonify({"code":403,'mes':'token错误'})


# 头像上传
@bp_users.route('/upload',methods=['POST'])
def upload():
    # 获取文件
    file = request.files['file']
    # 上传到upload文件夹
    # 解决文件名被覆盖
    # 1.文件重命名
    # 获取文件后缀
    filetext = os.path.splitext()[1]
    newfile = uuid.uuid4().hex+hex+filetext
    # 2.在upload下面建立一个文件夹,专业存文件夹的名字为userid
    userid = request.form.get('userid')
    # 根据userid创建文件夹
    # 判断用户文件夹是否存在,存在直接写文件,不存在创建
    path = './static/uoload/'+str(userid)
    # 不存在创建文件夹
    if os.path.exists(path):
        os.mkdir(path)
    file.save(os.path.join('./static/upload/'+str(userid)+'/',newfile))
    # 更新数据库
    User.query.filter_by(id=userid).update({'avater':'newfile'})
    return jsonify({"code":200,'filename':file.newfile})

form utils.myfiles import myf
# 获取某个用户下所有的文件
@bp_users.route('/getFiles',methods=['GET','DELETE'])
def getFiles():
    if request.method == "GET":
        # 获取用户id
        id = request.args.get('userid')
        # 根据用户id调用文件类获取所有文件
        list = myt.show_all(id)
        filelist = []
        for i in list:
            dict={}
            dict['name'] = i
            dict['url'] = 'http://localhost:5000static/upload/'+str(id)+"/"str(i)
            filelist.append(dict)

        return jsonify({"code":200,'list':filelist})
    elif request.method == "DELETE"
        # 删除
        # 获取userid,文件名
        userid = request.args.get('userid')
        filename = request.args.get('filename')
        # 调用删除方法
        myf.remove_file(userid,filename)
        # 返回结果
        return jsonify({"code"200})


